package com.macro.mall.sms.service.impl;


import com.macro.mall.common.api.CommonResult;
import com.macro.mall.common.service.RedisService;
import com.macro.mall.sms.config.BeanConfig;
import com.macro.mall.sms.service.ISmsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

@Service
public class SmsServiceImpl implements ISmsService {

    @Autowired
    private RedisService redisService;
    @Autowired
    private DoSend doSend;
    @Autowired
    private BeanConfig beanConfig;


    /**
     * 发送验证码接口
     * @author 高强
     * @Date 2020年8月28日
     * @param mobile
     * @return
     */
    @Override
    public CommonResult sendRound6Sms(String mobile) {
        if (this.allowSend(mobile)) {
            boolean isNewCode = false;//判断验证码是新生成的还是从redis中取出来的，新生成的需要放到redis中
            String key = "code:" + mobile;
            Map<String, String> param = new HashMap<>();//验证码，key暂时为code，value是6位随机数
            //查看redis中是否已经存在验证码的缓存
            String code = String.valueOf(this.redisService.get(key));
            //redis中存在该验证码，将该验证码放到map中返回
            if (!StringUtils.isEmpty(code) && !"null".equals(code)) {
                param.put("code", code);
            } else { //redis中不存在该验证码，随机生成验证码
                //生成6位随机数
                code = String.valueOf(new Random().nextInt(899999) + 100000);
                param.put("code", code);
                isNewCode = true;
            }
            //6位验证码短信模板
            String templateCode = beanConfig.round6TemplateCode;
            //调用doSend方法
            String result = this.doSend.doSend(mobile, templateCode, param);
            System.out.println(result);
            // 如果返回的是OK，则发送成功
            if ("OK".equals(result)) {
                //发送成功后在redis中记录给该短信发送过验证码，设置1分钟失效
                this.redisService.set("oneMinute:" + mobile, "hasSend",60);
                // 将生成的验证码放到缓存中，存在时间为5分钟
                if (isNewCode) { // isNewCode为true时证明验证码为新生成的，为false证明验证码是从redis中取的
                    this.redisService.set(key, code, 300);
                }
                return CommonResult.success("发送成功");
            }else if("isv.BUSINESS_LIMIT_CONTROL".equals(result)){
                return CommonResult.failed("已到达当天获取验证码上限");
            }
            return CommonResult.failed("验证码发送失败");
        } else {
            return CommonResult.failed("1分钟之内不能再次发送");
        }
    }

    /**查询当前手机号是否在redis中有记录，
     * @param mobile
     * @return 结果为true证明1分钟之内该手机号未获取过验证码
     */
    private boolean allowSend(String mobile) {
        String key = "oneMinute:" + mobile;
        Object obj = this.redisService.get(key);
        return null == obj;
    }


    /**
     * 通过手机号取得redis中的验证码缓存，和参数中的验证码对比，验证验证码是否正确
     * @author 高强
     * @Date 2020年8月28日
     * @param mobile 手机号
     * @param sendCode 验证码
     * @return
     */
    public CommonResult verifyCode(String mobile, String sendCode){
        Object o = this.redisService.get("code:" + mobile);
        if(o == null){
            return CommonResult.failed("验证码已失效");
        }else{
            String code = String.valueOf(this.redisService.get("code:" + mobile));
            if(sendCode.equals(code)){
                return CommonResult.success(1);
            }else{
                return CommonResult.failed("验证码输入不正确");
            }
        }

    }
}
